package com.cwt_taxi_xa.protocol.socket;

import android.content.Context;

import com.cwt_taxi_xa.constants.SPConstants;
import com.cwt_taxi_xa.model.AaData;
import com.cwt_taxi_xa.model.AreaFence;
import com.cwt_taxi_xa.model.ContactInfo;
import com.cwt_taxi_xa.model.EventInfo;
import com.cwt_taxi_xa.model.QuestionInfo;
import com.cwt_taxi_xa.protocol.MCUUtil;
import com.cwt_taxi_xa.service.DvrService;
import com.cwt_taxi_xa.service.DvrTCService;
import com.cwt_taxi_xa.timer.TimerHeartBeat;
import com.cwt_taxi_xa.util.AppLog;
import com.cwt_taxi_xa.util.DateUtil;
import com.cwt_taxi_xa.util.ExceptionUtil;
import com.cwt_taxi_xa.util.SPUtils;
import com.cwt_taxi_xa.util.StringUtil;
import com.cwt_taxi_xa.util.Tools;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zr
 * 通讯平台协议解码
 */
public class Decoder{

	private static final String TAG = "Decoder-undi";
	//	private static final String TAG = SZDecoder.class.getSimpleName();

	MessageClient messageClient;

	BusinessProcessSZ mBusinessProcessSZ;

	private Decoder(MessageClient messageClient) {
		this.messageClient = messageClient;
	}

	public Decoder(MessageClient messageClient, BusinessProcessSZ mBusinessProcessSZ) {
		this(messageClient);
		this.mBusinessProcessSZ = mBusinessProcessSZ;
	}

	/**
	 * 解码调度中心
	 * @param bytes
	 */
	public void decoderQH808Data(byte[] bytes, Context context){
		try {
			bytes = move7E(bytes);

			TimerHeartBeat.hasReturn = 0;

			String bytesStr = Tools.parseByte2HexStr(bytes);



			if(bytesStr.startsWith("7E8001")){
				AppLog.i("【接收】-通用应答" + bytesStr);
			}else if(bytesStr.startsWith("7E9")){
				AppLog.e("【接收】-视频指令" + bytesStr);
				if(bytesStr.startsWith("7E9508")){
					AppLog.e(TAG,"过滤9508,放弃透传");
					AppLog.savelog("过滤9508,放弃透传");
					return;
				}
				if(SPUtils.getParamInteger(SPConstants.SPK_dvr, SPConstants.SPV_dvr)==2){
					DvrTCService.getInstance().dvrTC(bytes);
				}else{
					DvrService.getInstance().send95Order(bytes);
				}
				return;
			}else{
				AppLog.e("【接收】" + bytesStr);
			}

			AppLog.d(TAG + "【接收平台数据】" +bytesStr);

			//转义
			bytes = Tools.yxReversal(bytes);

			/**
			 * bit10-bit12为数据加密标识位；
			 * 当此三位都为0，表示消息体不加密；
			 * 当第10位为1，表示消息体经过RSA算法加密；
			 */
			boolean rsa = false; //消息体是否RSA加密 true RSA加密，false RSA不加密
			int nOff = 1;
			//消息ID
			byte[] idByte = Tools.byteTobyte(bytes, nOff, 2);
			int msgId = Integer.parseInt(Tools.parseByte2HexStr(idByte), 16);
			nOff+=2;
			//消息体属性
			byte[] mBodyAttr = Tools.byteTobyte(bytes, nOff, 2);
			// 是否分包
			int pkgInfo = 0;
			int bodylen = 0;
			try {
				//解析消息体属性
				String bodyAttr = Tools.byteTobit(mBodyAttr);
				//分包
				pkgInfo = Integer.valueOf(bodyAttr.substring(2,3),2);
				//消息体长度
				bodylen = Integer.valueOf(bodyAttr.substring(6, 16),2);

				int incryption = Integer.valueOf(bodyAttr.substring(5,6),2);
				if(incryption == 1){
					rsa = true;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

			nOff+=2;
			// 终端标识
			String terminalMark = Tools.bcd2Str(Tools.byteTobyte(bytes, nOff, 6));
			nOff+=6;
			// 消息体流水号
			int seq = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(bytes, nOff, 2)),16);
			nOff+=2;

			int pkgCount = 0;
			int pkgNum = 0;
			// 消息包封装项
			if(pkgInfo == 1){
				// 消息总包数	WORD
				pkgCount = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(bytes, nOff, 2)), 16);
				nOff+=2;
				// 包序号	WORD
				pkgNum = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(bytes, nOff, 2)), 16);
				nOff+=2;
			}
			//应该判断设备ID号，要是不是本设备的消息，不做任何处理//
			//消息体
			//转义
			byte[] data = Tools.byteTobyte(bytes, nOff, bodylen);

			AaData aaData = new AaData();
			aaData.setMid(msgId);
			aaData.setSeq(seq);
			ArrayList<Object> dataList = aaData.getDataList();
			ArrayList<Object> itemsList = aaData.getItemsList();

			/**终端通用应答*/
			switch (msgId) {

				case 0x8001:	// 中心通用应答
					try {
						int num = 0;
						// 应答流水号
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num +=2;
						// 应答ID
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num +=2;
						// 结果	0:成功/确认	1:失败	2:消息有误
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8103:	// 3.2.6	设置终端参数
					try {

						int num = 0;
						// 参数总数
					/*int paramsum = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
					num +=1;*/

						Map<String, Object> paramMap = new HashMap<String, Object>();

						while (num < data.length) {
							//参数ID
							String paramId = Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2));
							num +=2;
							//参数长度
							int paramLength = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
							num +=1;
							String paramvalue = Tools.parseByte2HexStr(Tools.byteTobyte(data, num, paramLength));
							num += paramLength;
							paramMap.put(paramId, paramvalue);
						}

						// 参数值
						dataList.add(paramMap);
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));

						mBusinessProcessSZ.process(aaData, context);

					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8104:   //3.2.7	查询终端参数
				case 0x8F19:   //3.2.7	查询终端参数
				case 0x8F18:   //3.2.7	查询终端参数
					try {
						// 参数ID
						int[] paramsIds = new int[data.length/2];
						for(int i = 0, j = 0; i<data.length; i += 2,j += 1){
							String midId = Tools.parseByte2HexStr(Tools.byteTobyte(data, i, 2));
							System.out.println("midId:"+midId);
							int paramsId = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, i, 2)),16);
							paramsIds[j] = paramsId;
						}
						dataList.add(paramsIds);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8105:   // 3.2.9	 终端控制
					try {
						int num = 0;
						// 命令字
						int cmdWord = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						dataList.add(cmdWord);
//					if(cmdWord == 1){	/** 无线升级*/
//						num += 1;
//						/** 命令参数*/
//						// 设备类型
//						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
//						num += 1;
//						// 厂商标识
//						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
//						num += 1;
//						// 硬件版本号
//						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 1)));
//						num += 1;
//						// 软件版本号
//						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 2)));
//						num += 2;
//						// APN
//						byte[] apnByte = Tools.byteToSubstringToByte(data, num, data.length - num);
//						String apn = Tools.byteToString(apnByte, 0, apnByte.length);
//						dataList.add(apn);
//						num += apnByte.length + 1;
//						// 拨号用户名
//						byte[] userNameByte = Tools.byteToSubstringToByte(data, num, data.length - num);
//						String userName = Tools.byteToString(userNameByte, 0, userNameByte.length);
//						dataList.add(userName);
//						num += userNameByte.length + 1;
//						// 拨号密码
//						byte[] passwordByte = Tools.byteToSubstringToByte(data, num, data.length - num);
//						String password = Tools.byteToString(passwordByte, 0, passwordByte.length);
//						dataList.add(password);
//						num += passwordByte.length + 1;
//						// 升级服务器地址
//						byte[] ipByte = Tools.byteToSubstringToByte(data, num, data.length - num);
//						String ip = Tools.byteToString(ipByte, 0, ipByte.length);
//						dataList.add(ip);
//						num += ipByte.length + 1;
//						// 升级服务器端口
//						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
//						num += 1;
//					}
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8b04:   // 3.2.13	报警确认/接触报警
					try {
						// 解除防劫报警标志位
						//					ConstantsAram.setAlarmStateValue(0, 0);
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8201:   // 3.2.14	位置信息查询
					try {
						/** 无参数*/
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8202:   // 3.2.16	位置跟踪控制
					try {
						int num = 0;
						/**
						 * 13	跟踪方式	UINT8
						 * 				0X00:按时间间隔、持续时间；
						 * 				0X11:按距离间隔、持续距离；
						 * 				0X01:按时间间隔、持续距离；
						 * 				0X10:按距离间隔、持续时间；
						 *				0XFF:停止当前跟踪（终端忽略后面字段）
						 */
						String type = Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1));
						dataList.add(type);
						num +=1;
						//	时间/距离间隔	UINT16	时间单位为秒(s)	距离间隔为米
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num +=2;
						//	持续时间/距离	UINT32	时间单位为秒(s)	距离间隔为米
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
						num +=4;
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8300:   //3.2.24	文本信息下发
					try {
						int num = 0;
						//标志
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 文本信息
						String text = "";
						byte[] textByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						if(textByte != null && textByte.length != 0){
							text = Tools.byteToString(textByte,0, textByte.length);
						}
						dataList.add(text);

						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);

					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8301:   //3.2.25	事件设置
					try {
						int num = 0;
						//	事件项个数  0：删除终端现有所有事件
						int count = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						AppLog.e("事件设置：count："+count);
						dataList.add(count);
						num += 1;

						if(count != 0){
							ArrayList<EventInfo> infos = new ArrayList<EventInfo>();
							for (int i = 0; i < count; i++) {
								try {
									EventInfo eventInfo = new EventInfo();
									//事件ID
									int id = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
									AppLog.e("事件设置：id："+id);
									eventInfo.setId(id);
									num += 1;
									//事件内容
									byte[] contentbyte = Tools.byteToSubstringToByte(data, num, data.length - num);
									String content = Tools.byteToString(contentbyte, 0, contentbyte.length);
									AppLog.e("事件设置：content："+content);
									eventInfo.setText(content);
									num += contentbyte.length + 1;
									eventInfo.setCreatTime(DateUtil.getNowDate());
									eventInfo.setIsRead(0);
									eventInfo.setIsDone(0);

									infos.add(eventInfo);

								} catch (Exception e) {
									e.printStackTrace();
								}
							}
							dataList.add(infos);
						}
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8302:   //3.2.27	提问下发
					try {
						AppLog.i(TAG, "提问下发："+Tools.parseByte2HexStr(bytes));
						int num = 0;
						// 标志
						String flag = StringUtil.getAntitone(Tools.byteTobit(Tools.byteTobyte(data, num, 1)));
						num += 1;
						// 问题id
						int questionId = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
						num += 4;
						// 问题
						byte[] questionbyte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String question = Tools.byteToString(questionbyte, 0, questionbyte.length);
						num = num +questionbyte.length+1;

						QuestionInfo info = new QuestionInfo();
						info.setId(questionId);
						info.setFlag(flag);
						info.setSerialId(seq);
						info.setText(question);

						for (int i = 0; i < 50; i++) {
							if(data.length > num){

								try {
									//答案ID
									int id = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
									num += 1;
									//答案内容
									byte[] contentByte = Tools.byteToSubstringToByte(data, num, data.length-num);
									String content = Tools.byteToString(contentByte, 0, contentByte.length);
									num += contentByte.length + 1;

									info.setAnswer(id, content);
								} catch (Exception e) {
									e.printStackTrace();
								}

							}else{
								break;
							}
						}
						dataList.add(info);
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8305:   //3.2.29	文本信息查询
					try {
						int num = 0;
						// 标志
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;

						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8400:   //3.2.31	电话回拨
					try {
						int num = 0;
						// 标志
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 语音通道	0：GSM 	1：VOIP
						//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						//					num += 1;
						// 电话号码
						byte[] phoneByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String phone = Tools.byteToString(phoneByte, 0, phoneByte.length);
						dataList.add(phone);
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8401:   // 3.2.32	设置电话本
					try {
						int num = 0;

						//联系人总数
						int count = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						dataList.add(count);
						num += 1;

						if(count != 0){

							ArrayList<ContactInfo> contacts = new ArrayList<ContactInfo>();

							/** 联系人项*/
							for (int i = 0; i < count; i++) {
								// 标志
								int flag = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
								num += 1;

								// 电话号码
								byte[] telbyte = Tools.byteToSubstringToByte(data, num, data.length-num);
								String tel = Tools.byteToString(telbyte, 0, telbyte.length);
								num += telbyte.length + 1;

								//联系人
								byte[] nameByte = Tools.byteToSubstringToByte(data, num, data.length-num);
								String name = Tools.byteToString(nameByte, 0, nameByte.length);
								num += nameByte.length + 1;

								ContactInfo contact = new ContactInfo();
								contact.setType(flag);
								contact.setName(name);
								contact.setPhone(tel);

								contacts.add(contact);
							}
							dataList.add(contacts);
						}
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8500:   //3.2.33	车辆控制
					try {
//					AppLog.e("车辆控制:"+Tools.parseByte2HexStr(data));
						int num = 0;
						// 控制项
						int item = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						dataList.add(item);
						num += 1;
						// 控制命令
						int mid = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						dataList.add(mid);
						num += 1;
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));

//					AppLog.e("车辆控制--控制项："+item+"      控制："+mid);

						if(item<5&&item>0){
							MCUUtil.setIO(item+1, mid==0);
						}

//					BusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8600:   //3.2.18	设置圆形区域
					try {
						int num = 0;
						//	设置属性	BYTE	0：更新区域；1：追加区域；  2：修改区域
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//  区域总数	BYTE
						int count = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						num += 1;
						//					dataList.add(count);

						if(count > 0){
							ArrayList<AreaFence> fences = new ArrayList<AreaFence>();
							for (int i = 0; i < count; i++) {
								AreaFence circle = new AreaFence();
								circle.setFenceType(AreaFence.TYPE_CIRCLE);
								//						区域ID	DWORD
								int areaId = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								circle.setAreaId(areaId);
								//						区域属性	WORD
								//	int areaAttrib = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16);
								String areaAttribute = StringUtil.getAntitone(Tools.byteTobit(Tools.byteTobyte(data, num, 2)));

								num += 2;
								circle.setAreaAttribute(areaAttribute);
								//						中心点纬度	DWORD
								int centreLat = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								circle.setCentreLat(centreLat);
								//						中心点经度	DWORD
								int centreLng = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								circle.setCentreLng(centreLng);
								//						半径	DWORD
								int radius = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								circle.setRadius(radius);
								/** 若区域属性0位为0则没有该字段*/
								if(!areaAttribute.startsWith("0")){
									//						起始时间	BCD[6]
									String startTime = Tools.bcd2Str(Tools.byteTobyte(data, num, 6));
									num += 6;
									circle.setStartTime(startTime);
									//						结束时间	BCD[6]
									String endTime = Tools.bcd2Str(Tools.byteTobyte(data, num, 6));
									num += 6;
									circle.setEndTime(endTime);
								}
								/** 若区域属性1位为0则没有该字段*/
								if(!String.valueOf(areaAttribute.charAt(1)).equals("0")){
									//						最高速度	WORD
									int maxSpeed = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16);
									num += 2;
									circle.setMaxSpeed(maxSpeed);
									//						超速持续时间	BYTE
									int timeLength = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
									num += 1;
									circle.setTimeLength(timeLength);
								}
								/** 若区域属性2、3、4、5、8位均为0则无该字段*/
								if(!(areaAttribute.subSequence(2, 6).equals("0000") &&
										String.valueOf(areaAttribute.charAt(8)).equals("0"))){
									//						区域顶灯提醒信息	STRING
									byte[] topLightMessageByte = Tools.byteToSubstringToByte(data, num, data.length-num);
									String topLightMessage = Tools.byteToString(topLightMessageByte, 0, topLightMessageByte.length);
									num += topLightMessageByte.length + 1;
									//								try {
									//									topLightMessage = CdSDK.decode(topLightMessage);
									//								} catch (Exception e) {
									//									// TODO Auto-generated catch block
									//									e.printStackTrace();
									//								}
									circle.setTopLightMessage(topLightMessage);
									//						区域司机提醒信息	STRING
									byte[] driverMessageByte = Tools.byteToSubstringToByte(data, num, data.length-num);
									String driverMessage = Tools.byteToString(driverMessageByte, 0, driverMessageByte.length);
									//								try {
									//									driverMessage = CdSDK.decode(driverMessage);
									//								} catch (Exception e) {
									//									// TODO Auto-generated catch block
									//									e.printStackTrace();
									//								}
									circle.setDriverMessage(driverMessage);
								}
								fences.add(circle);
							}

							// 参数值
							dataList.add(fences);

						}
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8601:	//3.2.19	删除圆形区域
					try {
						int num = 0;
						//区域数	BYTE
						int count = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						num += 1;
						int[] fenceIds = new int[count];
						for(int i = 0;i<count;i++){
							int fenceId = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
							num += 4;
							fenceIds[i] = fenceId;
						}
						dataList.add(fenceIds);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8602:   //3.2.20	设置矩形区域
					try {
						int num = 0;
						//	设置属性	BYTE	0：更新区域；1：追加区域；  2：修改区域
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//  区域总数	BYTE
						int count = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						num += 1;
						//					dataList.add(count);

						if(count > 0){
							ArrayList<AreaFence> fences = new ArrayList<AreaFence>();
							for (int i = 0; i < count; i++) {
								AreaFence rectangle = new AreaFence();
								rectangle.setFenceType(AreaFence.TYPE_RECTANGLE);
								//						区域ID	DWORD
								int areaId = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								rectangle.setAreaId(areaId);
								//						区域属性	WORD
								int areaAttrib = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16);
								//							String areaAttribute = Tools.byteTobit(Tools.byteTobyte(data, num, 2));
								String areaAttribute = Tools.byteTobit(Tools.int2Bytes(areaAttrib, 2));
								num += 2;
								//	左上点纬度	DWORD
								int leftTopLat = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								rectangle.setLeftTopLat(leftTopLat);
								//	左上点经度	DWORD
								int leftTopLng = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								rectangle.setLeftTopLng(leftTopLng);
								//	右下点纬度	DWORD
								int rightBottomLat = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								rectangle.setRightBottomLat(rightBottomLat);
								//	右下点经度	DWORD
								int rightBottomLng = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
								num += 4;
								rectangle.setRightBottomLng(rightBottomLng);
								/** 若区域属性0位为0则没有该字段*/
								if(areaAttribute.startsWith("1")){
									//						起始时间	BCD[6]
									String startTime = Tools.bcd2Str(Tools.byteTobyte(data, num, 6));
									num += 6;
									rectangle.setStartTime(startTime);
									//						结束时间	BCD[6]
									String endTime = Tools.bcd2Str(Tools.byteTobyte(data, num, 6));
									num += 6;
									rectangle.setEndTime(endTime);
								}
								/** 若区域属性1位为0则没有该字段*/
								if(String.valueOf(areaAttribute.charAt(1)).equals("1")){
									//						最高速度	WORD
									int maxSpeed = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16);
									num += 2;
									rectangle.setMaxSpeed(maxSpeed);
									//						超速持续时间	BYTE
									int timeLength = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
									num += 1;
									rectangle.setTimeLength(timeLength);
								}
								/** 若区域属性2、3、4、5、8位均为0则无该字段*/
								if(areaAttribute.subSequence(2, 6).equals("1111") &&
										String.valueOf(areaAttribute.charAt(8)).equals("1")){
									//						区域顶灯提醒信息	STRING
									byte[] topLightMessageByte = Tools.byteToSubstringToByte(data, num, data.length-num);
									String topLightMessage = Tools.byteToString(topLightMessageByte, 0, topLightMessageByte.length);
									num += topLightMessageByte.length + 1;
									rectangle.setTopLightMessage(topLightMessage);
									//						区域司机提醒信息	STRING
									byte[] driverMessageByte = Tools.byteToSubstringToByte(data, num, data.length-num);
									String driverMessage = Tools.byteToString(driverMessageByte, 0, driverMessageByte.length);
									rectangle.setDriverMessage(driverMessage);
								}
								fences.add(rectangle);
							}

							// 参数值
							dataList.add(fences);

						}
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8603:	//3.2.21	删除矩形区域
					try {
						int num = 0;
						//区域数	BYTE
						int count = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						num += 1;
						int[] fenceIds = new int[count];
						for(int i = 0;i<count;i++){
							int fenceId = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
							num += 4;
							fenceIds[i] = fenceId;
						}
						dataList.add(fenceIds);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8800:   //3.2.37	多媒体数据上传应答
					try {
						int num = 0;
						//多媒体ID
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
						num += 4;
						//重传包总数
						int count = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						dataList.add(count);
						num += 1;

						//重传包ID列表
						if(count != 0){
							int[] idArr = new int[count];
							for (int i = 0; i < count; i++) {
								try {
									idArr[i] = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
									num += 4;
								} catch (Exception e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
							dataList.add(idArr);
						}
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8801:   //3.2.38	摄像头立即拍摄命令
					try {
						int num = 0;
						//摄像头ID/通道ID
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//拍摄命令
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						// 拍照间隔/录像时间
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						// 保存标志
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 分辨率
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 图像/视频质量
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 亮度
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 对比度
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 饱和度
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 色度
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;

						//命令流水号
						dataList.add(seq);

						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8802:   //3.2.39	多媒体检索
					try {
						int num = 0;
						//通道ID
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//拍照原因
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 起始时间
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
						num += 6;
						// 结束时间
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
						num += 6;
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8803:   //3.2.41	多媒体上传命令
					try {
						AppLog.i("多媒体上传命令："+Tools.parseByte2HexStr(bytes));
						int num = 0;
						// 类型	UINT8	0x00：照片；0x01：音频；0x02：视频；其他：RFU
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//文件ID	UINT32
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
						num += 4;
						//起始地址	UINT32
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
						num += 4;
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8B00:	//3.2.42	订单任务下发
					//				if(Constants.INVITE_BIDS_INFO){
					//					Constants.TTS_AMOUNT_CONTROL = true;
					//					//记录订单号
					//					try {
					//						int num = 0;
					//						// 业务ID	uint32
					//						String orderId = ""+Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
					//						num += 4;
					//						dataList.add(orderId);
					//						if(Constants.KONG_ZHONG_STATE == 2){
					//							// 通用应答
					//							//							DispatchCenterUsers.witeMsg(QHEncoder.getTerminalGeneralResponse(seq, msgId, 0), 0);
					//							// 订单接受
					//							writeMsg(messageClient.getEncoder().getOrderAccept(orderId, 2), 0);
					//						}else{
					//							// 业务类型	UINT8	0:即时召车	1:预约召车	2:车辆指派
					//							dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data,num, 1)),16));
					//							num += 1;
					//							// 要车时间
					//							dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					//							num += 6;
					//							// 备注	STRING	其它要求
					//							byte[] remarksByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					//							String remarks = Tools.byteToString(remarksByte,0, remarksByte.length);
					//							dataList.add(remarks);
					//							num += remarksByte.length + 1;
					//							// 终端通用应答
					//							writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0), 0);
					//							// 订单接受
					//							//writeMsg(messageClient.getEncoder().getOrderAccept(orderId, 1), 0);
					//							mBusinessProcessSZ.process(aaData, context);
					//						}
					//					} catch (Exception e) {
					//						AppLog.e(ExceptionUtil.getInfo(e));
					//						e.printStackTrace();
					//					}
					//				}
					break;

				case 0x8b01:	//3.2.45	订单确认
					try {
						int num = 0;
						if(data.length<7){
							// 未中标
						}else{
							// 业务ID	uint32
							dataList.add(""+Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
							num += 4;
							// 业务类型	UINT8	0:即时召车	1:预约召车	2:车辆指派
							dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data,num, 1)),16));
							num += 1;
							// 要车时间
							dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
							num += 6;
							// 乘客位置经度	uint32
							dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
							num += 4;
							// 乘客位置纬度	uint32
							dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
							num += 4;
							// 目的地经度	uint32
							dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
							num += 4;
							// 目的地纬度	uint32
							dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
							num += 4;

							// 电召费
							dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 2)));
							num += 2;

							// 乘客电话号码	STRING
							byte[] phoneByte = Tools.byteToSubstringToByte(data, num, data.length-num);
							String phone = Tools.byteToString(phoneByte,0, phoneByte.length);
							dataList.add(phone);
							num += phoneByte.length + 1;
							// 备注	STRING	其它要求
							byte[] remarksByte = Tools.byteToSubstringToByte(data, num, data.length-num);
							String remarks = Tools.byteToString(remarksByte,0, remarksByte.length);
							dataList.add(remarks);
							num += remarksByte.length + 1;
						}
						// 通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8b09:	//3.2.47	订单取消
					// 业务ID	uint32
					dataList.add(""+Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, 0, 4)),16));
					// 终端通用应答
					writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
					mBusinessProcessSZ.process(aaData, context);
					break;

				case 0x8B10:   //10.3.5.38 外围设备指令下行透传
					try {
						int num = 0;
						// TypeID
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// DataType
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						// 数据包
						dataList.add(Tools.byteTobyte(data, num, data.length-num));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

//			case 0x9501:
//			case 0x9102:
//			case 0x9505:
//				//				RecorderBiz.serialId9505 = seq;
//			case 0x9509:
//			case 0x950A:
//				// 终端通用应答
//				DispatchCenterUsers.witeMsg(
//						Encoder.getTerminalGeneralResponse(seq, msgId, 0), 0);
//				dataList.add(data);
//				mBusinessProcessSZ.process(aaData, context);
//				AppLog.i("msgId:"+Tools.parseByte2HexStr(idByte));
//				break;

				case 0x9501:   // 实时音频传输请求
					try {
						int num = 0;

						// 服务器IP地址长度		BYTE
						int len = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						num += 1;
						// 服务器IP地址	STRING
						dataList.add(Tools.byteToString(data, num, len));
						num += len;
						//	TCP端口号
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						//	UDP端口号
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						//	通道号
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//	数据类型	BYTE
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 码流类型
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;

						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));

						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				/*case 0x9102:   // 音视频传输控制
				try {
					int num = 0;

					// 逻辑通道号	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 控制指令	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 关闭音视频类型	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 切换码流类型	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;

					mBusinessProcessSZ.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;
			case 0x9505:   // A.2.7.42　存储音视频检索
				try {
					int num = 0;

					// 查询属性	BYTE	1：音频，2：视频，3：音视频
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 码流类型	BYTE	码流类型，0表示主码流，1表示子码流
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 存储设备编号	BYTE	存储位置，0表示主存储器，1表示备份存储器
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 逻辑通道号	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 报警类型	64BITS	bit0-31见JT/T 808-2011表18报警标志位定义；全0表示无报警类型条件
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 8)),16));
					num += 8;
					// 开始时间	BCD[6]	YY-MM-DD-HH-MM-SS，全0表示无起始时间
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					num += 6;
					// 终止时间	BCD[6]	YY-MM-DD-HH-MM-SS，全0表示无终止时间
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					num += 6;
					mBusinessProcessSZ.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;
			case 0x9508:   // 终端搜索月历信息列表
				try {
					int num = 0;

					// 查询属性	BYTE	文件类型，0表示音视频，1表示音频，2表示视频，(用户自定义扩展；3 黑匣子 4 报警日志 5用户日志）
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 码流类型	BYTE	码流类型，0表示主码流，1表示子码流；(当使用自定义扩展时此字段填0)
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 存储设备编号	BYTE	存储位置，0表示主存储器，1表示备份存储器，
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 查询模式	BYTE	月历查询 0 所有录像 1报警 (当使用自定义扩展时此字段填0)
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 开始时间	BCD[2]	YY-MM，全0表示无起始时间条件 查询所有年月日信息
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 2)));
					num += 2;
					// 结束时间	BCD[2]	YY-MM，全0表示无终止时间条件
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 2)));
					num += 2;

					mBusinessProcessSZ.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;
			case 0x9509:   // 存储音视频回放请求
				try {
					int num = 0;
					// 服务器IP地址长度	BYTE
					int len = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
					num += 1;
					// 服务器IP地址	STRING
					dataList.add(Tools.byteToString(data, num, len));
					num += len;
					// 服务器音视频通道监听端口号（TCP）	WORD
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					num += 2;
					// 服务器音视频通道监听端口号（UDP）	WORD
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					num += 2;
					// 逻辑通道号	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 音视频属性	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 存储器类型
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 传输方式	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 快进或快退倍数	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 码流类型	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 开始时间	BCD[6]
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					num += 6;
					// 结束时间	BCD[6]	YY-MM-DD-HH-MM-SS，为0表示一直回放，传输方式为4时，该字段无效
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					num += 6;

					// 终端通用应答
					DispatchCenterUsers.witeMsg(
							Encoder.getTerminalGeneralResponse(seq, msgId, 0), 0);
					dataList.add(data);
					mBusinessProcessSZ.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;
			case 0x950A:   // 存储音视频回放控制
				try {
					int num = 0;
					// 音视频通道号	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 传输控制	BYTE
					int transType = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
					dataList.add(transType);
					num += 1;
					// 快进或快退倍数	BYTE
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 拖动回放位置	BCD[6]
					//					if(transType == 5){
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					num += 1;
					//					}

					// 终端通用应答
					DispatchCenterUsers.witeMsg(
							Encoder.getTerminalGeneralResponse(seq, msgId, 0), 0);
					mBusinessProcessSZ.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;*/
				/*case 0x8804:
			case 0x8805:
			case 0x8806:
			case 0x8807:
			case 0x8808:
			case 0x8809:
			case 0x880A:
			case 0x880B:
				dataList.add(data);
				mBusinessProcessSZ.process(aaData, context);
				break;*/

				case 0x8804:   // 实时音频传输请求
					//				try {
					//					int num = 0;
					//
					//					/*// 服务器IP
					//					byte[] ipByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					//					String ip = Tools.byteToString(ipByte,0, ipByte.length);
					//					dataList.add(ip);
					//					num += ipByte.length + 1;
					//					//	TCP端口号
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					//					num += 2;
					//					//	UDP端口号
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					//					num += 2;
					//					//	通道号
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					//					num += 1;
					//					//	码流类型
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					//					num += 1;
					//					// 音视频传输时间
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					//					num += 2;
					//					// 多媒体数据ID
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					//					num += 4;*/
					//
					//					RecorderBiz.serialId8804 = seq;
					//					RecorderBiz.mediaId8804 = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, data.length-4, 4)),16);
					//
					//					// 应答测试
					//					//					writeMsg(messageClient.getEncoder().getMediaTransferResponder(0), 0);
					//
					//					dataList.add(data);
					//					mBusinessProcessSZ.process(aaData, context);
					//				} catch (Exception e) {
					//					AppLog.e(ExceptionUtil.getInfo(e));
					//					e.printStackTrace();
					//				}
					break;
				/*case 0x8805:   // 实时音视频传输关闭
				try {
					int num = 0;
					// 通道号
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 多媒体数据ID
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					num += 4;

					// 终端通用应答
					DispatchCenterUsers.witeMsg(
							Encoder.getTerminalGeneralResponse(seq, msgId, 0), 0);
					dataList.add(data);
					mBusinessProcessSZ.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;*/
				case 0x8806:   // 实时音视频传输状态通知
					try {
					/*int num = 0;
					// 通道号
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 丢包率评估值
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;*/

						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						dataList.add(data);
						dataList.add(data);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8807:   // 存储音视频检索
					//				try {
					//					/*int num = 0;
					//					// 类型
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					//					num += 1;
					//					// 通道号
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					//					num += 4;
					//					// 报警类型
					//					dataList.add(0);
					//					num += 8;
					//					// 起始时间
					//					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					//					num += 6;
					//					// 终止时间
					//					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					//					num += 6;*/
					//
					//					// 终端通用应答
					//					DispatchCenterUsers.witeMsg(
					//							Encoder.getTerminalGeneralResponse(seq, msgId, 0), 0);
					//					RecorderBiz.serialId8807 = seq;
					//					dataList.add(data);
					//					mBusinessProcessSZ.process(aaData, context);
					//				} catch (Exception e) {
					//					AppLog.e(ExceptionUtil.getInfo(e));
					//					e.printStackTrace();
					//				}
					break;
				case 0x8808:   // 存储音视频回放请求
					try {
					/*int num = 0;
					// 多媒体数据ID
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					num += 4;
					// 服务器IP
					byte[] ipByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					String ip = Tools.byteToString(ipByte,0, ipByte.length);
					dataList.add(ip);
					num += ipByte.length + 1;
					//	TCP端口号
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					num += 2;
					//	UDP端口号
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					num += 2;
					//	视频通道号
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					num += 4;
					//	音视频标识
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					//	码流类型
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 开始时间
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					num += 6;*/

						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						dataList.add(data);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8809:   //存储音视频回放控制
					try {
					/*int num = 0;
					// 多媒体数据ID
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					num += 4;
					// 回放控制
					int type = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
					dataList.add(type);
					num += 1;
					if(type == 3){
						// 快进幅度
						int quickPlayX = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
						dataList.add(quickPlayX);
						num += 1;
					}else if(type == 4){
						// 拖动时间
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
						num += 6;
					}*/

						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						dataList.add(data);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x880A:   //存储音视频上传请求
					try {
					/*int num = 0;
					// 服务器地址
					byte[] ipByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					String ip = Tools.byteToString(ipByte,0, ipByte.length);
					dataList.add(ip);
					num += ipByte.length + 1;
					// 端口号
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					num += 2;
					// 用户名
					byte[] userByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					String user = Tools.byteToString(userByte,0, userByte.length);
					dataList.add(user);
					num += userByte.length + 1;
					// 密码
					byte[] pwdByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					String pwd = Tools.byteToString(pwdByte,0, pwdByte.length);
					dataList.add(pwd);
					num += pwdByte.length + 1;
					// 文件上传路径
					byte[] pathByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					String path = Tools.byteToString(pathByte,0, pathByte.length);
					dataList.add(path);
					num += pathByte.length + 1;
					// 通道号
					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					num += 1;
					// 起始时间
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					num += 6;
					// 终止时间
					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					num += 6;*/

						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						dataList.add(data);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x880B:   //存储音视频上传停止
					try {
					/*int num = 0;
					// 停止传输标识
					int type = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
					dataList.add(type);
					num += 1;
					// String[] 文件名列表
					if(type != 0){
						String[] files = new String[type];
						for(int i = 0;i<files.length;i++){
							byte[] fileByte = Tools.byteToSubstringToByte(data, num, data.length-num);
							String file = Tools.byteToString(fileByte,0, fileByte.length);
							dataList.add(file);
							num += fileByte.length + 1;
							files[i] = file;
						}
						dataList.add(files);
					}*/

						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						dataList.add(data);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8B0A:   //中心确认报警
					try {
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8B0B:   //中心解除报警
					try {
						// 无消息体，ISU回复通用应答。
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8B11:   //  中心巡检设备
					try {
						int num = 0;
						int[] typeList = new int[data.length];
						for(int i =0;i<data.length;i++){
							int type = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
							num += 1;
							typeList[i] = type;
						}
						dataList.add(typeList);
						// 巡检设备类型代码
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8C01:   //  防伪密标
					try {
						int num = 0;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						dataList.add(Tools.byteTobyte(data, num, data.length-3));
						// 巡检设备类型代码
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8B50:   //  出租车司机卡黑名单信息查询响应
					try {
						int num = 0;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 3)));
						num += 3;
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 3)));
						num += 3;
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8B51:   //  出租车司机卡黑名单信息下载响应
					try {
						int num = 0;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
						num += 2;
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 3)));
						num += 3;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
						num += 4;
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
						num += 4;
						dataList.add(Tools.byteTobyte(data, num, data.length-num));

						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8B52:   //  出租车司机卡黑名单更新通知
					try {
						int num = 0;
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 3)));
						num += 3;
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 3)));
						num += 3;
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8805:   //10.3.5.40 音频检索
					try {
						AppLog.i(TAG, "音频检索："+Tools.parseByte2HexStr(bytes));
						int num = 0;
						// 录音原因
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 起始时间
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
						num += 6;
						// 结束时间
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
						num += 6;
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				/*case 0x8B0A:   //10.3.5.43 中心确认报警
				try {
					// 无消息体，ISU回复通用应答。
					BusinessProcessQH.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;*/
				/*case 0x8B0B:   //10.3.5.44 中心解除报警
				try {
					// 无消息体，ISU回复通用应答。
					BusinessProcessQH.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;*/
				/*case 0x8B11:   //10.3.5.45 中心巡检设备
				try {
					int num = 0;
					// 巡检设备类型代码
					BusinessProcessQH.process(aaData, context);
				} catch (Exception e) {
					AppLog.e(ExceptionUtil.getInfo(e));
					e.printStackTrace();
				}
				break;	*/

				case 0x8004:   //3.2.56	校时应答
					try {
						int num = 0;
						// 中心时间	BCD[6]
						dataList.add(Tools.bcd2Str(data));
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8900:   //3.2.51	下行透传
					try {
						int num = 0;
						//					数据类型	UINT8
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//					厂商标识（二级类型）	UINT32
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
						num += 1;
						//					数据包	UINT8[]
						dataList.add(Tools.byteTobyte(data, num, data.length-num));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8D00:   // 3.2.54	电子服务证下发
					try {

						dataList.add(pkgInfo);
						dataList.add(pkgCount);
						dataList.add(pkgNum);
						int num = 0;
						if(pkgInfo == 0 || pkgNum == 1){

							//					司机姓名	STRING
							byte[] driverNameByte = Tools.byteToSubstringToByte(data, num, data.length-num);
							String driverName = Tools.byteToString(driverNameByte,0, driverNameByte.length);
							dataList.add(driverName);
							num += driverNameByte.length + 1;
							//					服务公司	STRING
							byte[] companyByte = Tools.byteToSubstringToByte(data, num, data.length-num);
							String company = Tools.byteToString(companyByte,0, companyByte.length);
							dataList.add(company);
							num += companyByte.length + 1;
							//					司机代码	BCD[6]
							dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
							num += 6;
							//					驾驶员唯一编号	BYTE[50]
							dataList.add(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 50)));
							num += 50;
							//					星级	BCD
							dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 1)));
							num += 1;
							//					星级显示文本	STRING
							byte[] levelByte = Tools.byteToSubstringToByte(data, num, data.length-num);
							String levelText = Tools.byteToString(levelByte,0, levelByte.length);
							dataList.add(levelText);
							num += levelByte.length + 1;
							//					照片格式编码	BYTE
							dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
							num += 1;
							//					窗口大小	BYTE
							dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
							num += 1;

							//电子服务证版本	BCD[6]
							dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
							num += 6;

						}
						//					照片内容	UINT8[]
						byte[] arr = Tools.byteTobyte(data, num, data.length-num);
						String arrHex = Tools.parseByte2HexStr(arr);
						dataList.add(arrHex);

						//					System.out.println("****************************"+arrHex+"**************************");
						//					AppLog.i("");
						AppLog.i("****************************pkgCount: "+pkgCount+" ; pkgNum:"+pkgNum+"; dataLength:"+arr.length);
						//					System.out.println("****************************pkgCount: "+pkgCount+" ; pkgNum:"+pkgNum+"; dataLength:"+arr.length);
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				case 0x8D01:	//3.2.57	文件下发
					try {
						int num = 0;
						//					文件类型	BYTE
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//					文件名	STRING
						byte[] fileNameByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String fileName = Tools.byteToString(fileNameByte,0, fileNameByte.length);
						dataList.add(fileName);
						num += fileNameByte.length + 1;
						//					窗口大小	BYTE
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//					文件校验	BYTE
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//					文件内容	BYTE[]
						dataList.add(Tools.byteTobyte(data, num, data.length-num));
						// 终端通用应答
						writeMsg(messageClient.getEncoder().getTerminalGeneralResponse(seq, msgId, 0));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x8D02:	// 3.2.58	密钥更新通知
					try {
						int num = 0;
						//	密钥类型	UINT8	0：PSAM  1：ESAM
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						//	文件标识符	UINT16
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 2)),16));
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}

					break;

				case 0x8D03:	// 3.2.59	密钥内容下发
					try {
						int num = 0;
						// 密钥类型	UINT8	0：PSAM 1：ESAM
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						num += 1;
						// 装载密文	UINT8[33]
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 33)),16));
						num += 33;
						// 密钥版本	BCD[7]	YYYYMMDDhhmmss
						dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 7)));
						num += 7;
						// 同步号	UINT32	与密钥更新请求中的一致
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
						num += 4;
						// 是否更新结束	UINT8	1：最后一条密钥
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}

					break;

				case 0x5201:   //防伪码
					if(data.length<8){
						writeMsg(messageClient.getEncoder().getTerminalResponse(msgId, 2));
						break;
					}

					int num = 0;
					//显示方式
					byte[] stylebyte = Tools.byteTobyte(data, num, 1);
					int sytle = Integer.parseInt(Tools.parseByte2HexStr(stylebyte), 16);
					if(sytle == 161){
						sytle = 1;
					}else if(sytle == 162){
						sytle = 2;
					}
					num+=1;

					//显示字符的颜色
					byte[] colorbyte = Tools.byteTobyte(data, num, 1);
					int color = Integer.parseInt(Tools.parseByte2HexStr(colorbyte), 16);
					num+=1;

					//固定2字节显示内容。其中高字节有效，显示内容为字符（“0123456789”）其中之一，低字节预留填充0x00
					byte[] contentb = Tools.byteTobyte(data, num, 1);
					int content = Integer.parseInt(Tools.parseByte2HexStr(contentb), 16);
					num+=2;

					// 秒(收到后延迟N秒后显示)
					byte[] delaybyte = Tools.byteTobyte(data, num, 2);
					int delay = Integer.parseInt(Tools.parseByte2HexStr(delaybyte), 16);
					num+=2;

					// 显示时间
					byte[] timeb = Tools.byteTobyte(data, num, 2);
					int time = Integer.parseInt(Tools.parseByte2HexStr(timeb), 16);

					//应答
					writeMsg(messageClient.getEncoder().getTerminalResponse(msgId, 0));
					//发送给顶灯进行显示
					//				SendDateToSerial.witeSerial(TTEncoder.getSecurityCodeShow(content, 0, time,color));
					break;
				case 0x5202:   //扫描支付通知
					try {
						num = 0;
						// 支付结果
						dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16));
						// 订单号
						dataList.add(Tools.byteToString(data, num, data.length-num));
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				/****************************************电召业务开始******************************************/

				case 0x5203:   //招标
					//				try {
					//					num = 0;
					//					// 0.订单号
					//					byte[] orderId = Tools.byteToSubstringToByte(data, num, data.length);
					//					dataList.add(Tools.byteToString(orderId, 0, orderId.length));
					//					num += orderId.length + 1;
					//					// 1.订单时间	BCD[6]	YYMMDDhhmmss
					//					dataList.add(Tools.bcd2Str(Tools.byteTobyte(data, num, 6)));
					//					num += 6;
					//					// 2.抢答方式
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)), 16));
					//					num += 1;
					//					// 3.订单类型BYTE
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)), 16));
					//					num += 1;
					//					// 4.乘客姓名	String
					//					byte[] nameByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					//					if(nameByte != null && nameByte.length != 0){
					//						String name = Tools.byteToString(nameByte,0, nameByte.length);
					//						dataList.add(name);
					//						num = num + nameByte.length + 1;
					//					}else{
					//						dataList.add("");
					//						num = num + 1;
					//					}
					//					// 5.抢答电话号码
					//					byte[] phonebyte = Tools.byteToSubstringToByte(data, num, data.length-num);
					//					String phone = Tools.byteToString(phonebyte,0, phonebyte.length);
					//					dataList.add(phone);
					//					num = num + phonebyte.length + 1;
					//					// 6.开始经度
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					//					num += 4;
					//					// 7.开始纬度
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					//					num += 4;
					//					// 8.出发地
					//					byte[] saddrbyte = Tools.byteToSubstringToByte(data, num, data.length-num);
					//					String saddr = Tools.byteToString(saddrbyte,0, saddrbyte.length);
					//					dataList.add(saddr);
					//					num += saddrbyte.length + 1;
					//
					//					// 9.结束经度
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					//					num += 4;
					//					// 10.结束纬度
					//					dataList.add(Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16));
					//					num += 4;
					//					// 11.目的地
					//					byte[] eaddrbyte = Tools.byteToSubstringToByte(data, num, data.length-num);
					//					String eaddr = Tools.byteToString(eaddrbyte,0addrbyte.length);
					//					dataList.add(eaddr);
					//					num += eaddrbyte.length + 1;
					//
					//					// 12.调度简短信息	String
					//					byte[] messageByte = Tools.byteToSubstringToByte(data, num, data.length-num);
					//					if(messageByte != null && messageByte.length != 0){
					//						String message = Tools.byteToString(messageByte, 0, messageByte.length);
					//						dataList.add(message);
					//					}else{
					//						dataList.add("");
					//					}
					//					mBusinessProcessSZ.process(aaData, context);
					//				} catch (Exception e) {
					//					AppLog.e(ExceptionUtil.getInfo(e));
					//					e.printStackTrace();
					//				}
					break;
				case 0x5204:   //抢答确认
					try {
						num = 0;
						// 抢答结果
						int result = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)), 16);
						dataList.add(result);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x5205:   //电召中心处理结果
					try {
						num = 0;
						// 订单号
						byte[] orderId = Tools.byteToSubstringToByte(data, num, data.length);
						String orderIdStr = Tools.byteToString(orderId, 0, orderId.length);
						dataList.add(orderIdStr);
						num = num + orderId.length +1;
						// 抢答结果
						int result = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)), 16);
						dataList.add(result);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x5206:   //中标
					try {
						num = 0;
						// 0.定单号
						byte[] orderIdByte = Tools.byteToSubstringToByte(data, num, data.length);
						dataList.add(Tools.byteToString(orderIdByte, 0, orderIdByte.length));
						num += orderIdByte.length + 1;
						// 1.乘客姓名	String
						byte[] nameByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						//					String name = Tools.byteToString(nameByte,0, nameByte.length);
						//					dataList.add(name);
						//					num = num + nameByte.length + 1;
						if(nameByte != null && nameByte.length != 0){
							String name = Tools.byteToString(nameByte,0, nameByte.length);
							dataList.add(name);
							num = num + nameByte.length + 1;
						}else{
							dataList.add("");
							num = num + 1;
						}
						// 2.乘客电话
						byte[] phoneNumberByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						dataList.add(Tools.byteToString(phoneNumberByte, 0, phoneNumberByte.length));
						num += phoneNumberByte.length + 1;
						// 3.车牌号
						byte[] carNumberByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						dataList.add(Tools.byteToString(carNumberByte, 0, carNumberByte.length));
						num += carNumberByte.length + 1;
						// 4.描述信息
						byte[] messageByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String message = Tools.byteToString(messageByte, 0, messageByte.length);
						dataList.add(message);
						num += messageByte.length + 1;
						// 5.本机手机号
						byte[] localPhoneByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String localPhone = Tools.byteToString(localPhoneByte, 0, localPhoneByte.length);
						dataList.add(localPhone);
						num += localPhoneByte.length + 1;
						// 6.电召费
						byte[] feeByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String fee = Tools.byteToString(feeByte, 0, feeByte.length);
						dataList.add(fee);
						num += feeByte.length + 1;
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x5207:   //执行电召确认
					try {
						num = 0;
						// 处理结果
						int result = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)), 16);
						dataList.add(result);
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;
				case 0x5209:   //语音叫车
					try {
						num = 0;
						// 0.订单号
						byte[] orderIdByte = Tools.byteToSubstringToByte(data, num, data.length);
						String orderId = Tools.byteToString(orderIdByte, 0, orderIdByte.length);
						dataList.add(orderId);
						num = num + orderIdByte.length + 1;
						// 1.订单时间	BCD[6]	YYMMDDhhmmss
						String orderTime = Tools.bcd2Str(Tools.byteTobyte(data, num, 6));
						dataList.add(orderTime);
						num += 6;
						// 2.抢答方式	BYTE
						int qdType = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)), 16);
						dataList.add(qdType);
						num += 1;
						// 3.乘客姓名	String
						byte[] nameByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						//					String name = Tools.byteToString(nameByte,0, nameByte.length);
						//					dataList.add(name);
						//					num = num + nameByte.length + 1;
						if(nameByte != null && nameByte.length != 0){
							String name = Tools.byteToString(nameByte,0, nameByte.length);
							dataList.add(name);
							num = num + nameByte.length + 1;
						}else{
							dataList.add("");
							num = num + 1;
						}
						// 4.抢答电话号码	String
						byte[] phoneByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String phone = Tools.byteToString(phoneByte, 0, phoneByte.length);
						dataList.add(phone);
						num = num + phoneByte.length + 1;
						// 5.开始经度	DWORD
						int sLng = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
						dataList.add(sLng);
						num += 4;
						// 6.开始纬度	DWORD
						int sLat = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 4)),16);
						dataList.add(sLat);
						num += 4;
						// 7.出发地 String
						byte[] startingByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String starting = Tools.byteToString(startingByte, 0, startingByte.length);
						dataList.add(starting);
						num = num +startingByte.length+1;
						// 8.录音文件	String
						byte[] urlByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						String url = Tools.byteToString(urlByte, 0, urlByte.length);
						dataList.add(url);
						num = num +urlByte.length+1;
						// 9.调度简短信息	String
						byte[] messageByte = null;
						try {
							messageByte = Tools.byteToSubstringToByte(data, num, data.length-num);
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						if(messageByte != null && messageByte.length != 0){
							String message = Tools.byteToString(messageByte, 0, messageByte.length);
							dataList.add(message);
						}else{
							dataList.add("");
						}
						mBusinessProcessSZ.process(aaData, context);
					} catch (Exception e) {
						AppLog.e(ExceptionUtil.getInfo(e));
						e.printStackTrace();
					}
					break;

				/****************************************电召业务结束******************************************/

				//2.3.6	 WIFI热点控制
				case 0x5210:
					//				try {
					//					if(data.length != 1){
					//						writeMsg(messageClient.getEncoder().getTerminalResponse(msgId, 2), 0);
					//					}else{
					//						//通用应答
					//						writeMsg(messageClient.getEncoder().getTerminalResponse(msgId, 0), 0);
					//
					//						// 关闭开启:	1 打开	 2 关闭
					//						num = 0;
					//						final int switcher = Integer.parseInt(Tools.parseByte2HexStr(Tools.byteTobyte(data, num, 1)),16);
					//
					//						new Thread(){
					//							public void run() {
					//								WifiHostBiz wifiHostBiz = new WifiHostBiz(CarCallApplication.getInstance());
					//								if(switcher == 1){
					//									wifiHostBiz.setWifiApEnabled(true, null, null);
					//									AppLog.i("打开热点");
					//								}else if(switcher == 2){
					//									wifiHostBiz.setWifiApEnabled(false, null, null);
					//									AppLog.i("关闭热点");
					//								}
					//							};
					//						}.start();
					//					}
					//
					//				} catch (Exception e) {
					//					AppLog.e(ExceptionUtil.getInfo(e));
					//					e.printStackTrace();
					//				}
					break;
				default:
					break;
			}
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
		}
	}

	private byte[] move7E(byte[] bytes) {
		byte[] result = null;
		for (int i = 1; i < bytes.length-1; i++) {
			if(bytes[i]==0x7E){
				result = new byte[bytes.length-i];
				System.arraycopy(bytes, i, result, 0, result.length);
				move7E(result);
			}
		}
		return bytes;
	}

	private void writeMsg(byte[] buffer){
		if(this.messageClient != null){
			this.messageClient.sendMessage(buffer);
		}
	}

}
